package com.example.demo.thread;

import java.util.concurrent.*;

/**
 *
 * Runnable接口执行任务是不返回任何值的，Runnable的run()方法的执行结果是void,而Future接口的call方法是有返回结果的，这是Runnable跟Future的区别之一，
 * 它们的另一个不同之处就是实现了Runnable接口的任务执行是调用ExecutorService的execute(Runnable task)方法，
 * 而实现了Future接口的任务是调用ExecutorService的submit(Future task)方法。调用Future的get()方法就能直接得到任务的返回值，
 * 该方法会一直阻塞直到任务的结果出来为止，我们可以调用Future的isDone()方法来判断该任务的结果是否准备就绪。
 *
 * @author luowj12
 * @since 2021/4/1 10:41
 */
public class TestFuture {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newCachedThreadPool();

        Future<Integer> result1 = executor.submit(new Callable() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 0; i < 1000; i++) {
                    Thread.sleep(500); //模拟调用耗时
                    sum += i;
                }
                return sum;
            }

        });
        executor.shutdown();
        System.out.println(result1.isDone());
        System.out.println(result1.get());

    }
}
